#include "bsp_config.h"

/**
 *  @brief 针对发送mqtt线程而言的,向CJSON变量中填充数据,相当于初始化
 *  @param 无
 *  @brief 指向被分配出来,然后经过初始化的数据 
 */
cJSON *cJSON_Data_Init(void)
{
    cJSON *cJSON_Root = NULL; //json根节点

    cJSON_Root = cJSON_CreateObject();
    if (cJSON_Root == NULL)
    {
        return NULL;
    }
    cJSON_AddStringToObject(cJSON_Root, FROM_KEY, ConfigParam.MQTT_Param.mqtt_param_data.mqtt_topic); //这里是发送用的
    cJSON_AddStringToObject(cJSON_Root, TO_KEY, DEFAULT_TO_VALUE);
    cJSON_AddStringToObject(cJSON_Root, VALUE_KEY, DEFAULT_VALUE_VALUE);

    char *p = cJSON_Print(cJSON_Root);
    printf("cJSON_Print :%s\n", p);
    free(p);
    p = NULL;

    return cJSON_Root;
}

/**
 *  @brief 更新JSON里面的内容
 *  @param object :指向存有信息的cJSON结构体
 *  @param string :指向存有键值对的键的字符串
 *  @param d :     指向存有键值对的值的字符串
 *  @retval 1:表示更新成功
 *          0:表示更新失败
 */
uint8_t cJSON_Update(const cJSON *const object, const char *const string, void *d)
{
    cJSON *node = NULL;

    node = cJSON_GetObjectItem(object, string); //获取JSON节点  根据总结点,和key找到子节点
    if (node == NULL)
    { //这个节点为空
        return 0;
    }
    if (cJSON_IsBool(node))
    {
        int *b = (int *)d; //指针钻换
        (cJSON_GetObjectItem(object, string)->type) = *b ? cJSON_True : cJSON_False;
        return 1;
    }
    else if (cJSON_IsString(node))
    {
        cJSON_GetObjectItem(object, string)->valuestring = (char *)d;
        return 1;
    }
    else if (cJSON_IsNumber(node))
    {
        double *num = (double *)d;
        cJSON_GetObjectItem(object, string)->valuedouble = (double)*num;
        return 1;
    }
    else
    {
        return 0;
    }
}

/**
 *  @brief 将接收数据缓冲区中的JSON数据解析出来  主要是解析value的值
 *  @param data :指向存有JSON数据的字符串
 *  @param pd   :指向存储解析出来的字符串
 *  @retval 无
 */
void Process(void *data, char *pd)
{
    printf("\n开始解析数据\n");
    cJSON *root = NULL;
    cJSON *json_from = NULL;
    cJSON *json_to = NULL;
    cJSON *json_value = NULL;

    root = cJSON_Parse((char *)data);
    if (root == NULL)
    {
        goto __cJSON_Delete;
    }
    json_from = cJSON_GetObjectItem(root, FROM_KEY);
    json_to = cJSON_GetObjectItem(root, TO_KEY);
    json_value = cJSON_GetObjectItem(root, VALUE_KEY);

    printf("FROM: %s\n TO:%s\n VALUE:%s\n",
           json_from->valuestring,
           json_to->valuestring,
           json_value->valuestring);
    if (strstr(ConfigParam.MQTT_Param.mqtt_param_data.mqtt_topic, json_to->valuestring))
    {                                                                              //这个是发给本机的
        strncpy(pd, json_value->valuestring, strlen(json_value->valuestring) + 1); //后面的'\0'也得复制
                                                                                   //这里蜂鸣器响一声
        beep_queue_enum = BEEP_ONCE;
        pBEEP_QUEUE_ENUM = &beep_queue_enum;
        xQueueSend(beep_QueueHandler, (void *)&pBEEP_QUEUE_ENUM, portMAX_DELAY);
    }
__cJSON_Delete:
    cJSON_Delete(root);
}